package com.wyf.android.advance.main

import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.wyf.android.advance.R
import com.wyf.android.baselib.util.inflate

class MainAdapter : ListAdapter<Triple<String, Boolean, ActivityStarter>, MainAdapter.MainViewHolder>(
    MainDiff()
) {

    private val onItemClickListener by lazy { OnItemClickListener() }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder {
        return MainViewHolder(parent.inflate(R.layout.item_main_list))
    }

    override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
        holder.bind()
    }

    /**
     * kotlin 内部类
     * 有inner关键字修饰的等同于java中的非静态内部类，需要通过outer.Inner()创建实例；
     * 非静态内部类默认持有外部类的引用，可以访问外部类的属性及方法，包括私有的；
     * 非静态内部类能够方位外部类的私有属性及方法的原理，是通过静态方法实现的。
     * 没有inner关键字修饰的属于嵌套类，等同于java中的静态内部类，可以直接Outer.Inner()创建实例
     */
    inner class MainViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        init {
            itemView.setOnClickListener(onItemClickListener)
        }

        fun bind() {
            (itemView as TextView).apply {
                val itemData = getItem(adapterPosition)
                setTag(R.id.rv_item_tag, itemData.third)
                text = if (itemData.second) {
                    itemData.first
                } else {
                    "${itemData.first}(${context.getString(R.string.text_no_complete)})"
                }
            }
        }
    }

    /**
     * 这样写是为了复用一个OnItemClickListener对象，减少对象的创建与销毁，
     */
    class OnItemClickListener : View.OnClickListener {
        override fun onClick(v: View?) {
            val tag = v?.getTag(R.id.rv_item_tag) ?: return
            val activityStarter = tag as ActivityStarter
            activityStarter.invoke()
        }
    }


}

class MainDiff : DiffUtil.ItemCallback<Triple<String, Boolean, ActivityStarter>>() {
    override fun areItemsTheSame(
        oldItem: Triple<String, Boolean, ActivityStarter>,
        newItem: Triple<String, Boolean, ActivityStarter>
    ) = false

    override fun areContentsTheSame(
        oldItem: Triple<String, Boolean, ActivityStarter>,
        newItem: Triple<String, Boolean, ActivityStarter>
    ) = false
}